// #pragma once

// #include <iostream>

// /// 学生成绩的状态转换
// /// 成绩状态: "不及格"(<60)、"中等"(>=60 && <90)、"优秀"(>=90)

// /// @brief 环境类, 定义了客户感兴趣的接口，维护一个当前状态，并将与状态相关的操作委托给当前状态对象来处理
// class AbstractScoreState;
// class ScoreContext {
// public:
//     ScoreContext();
//     void SetState(std::shared_ptr<AbstractScoreState>& state) {
//         state_ = state;
//     }
//     std::shared_ptr<AbstractScoreState>& GetState() {
//         return state_;
//     }
//     void AddScore(int score);
    
// private:
//     std::shared_ptr<AbstractScoreState> state_ = nullptr;
// };

// /// @brief 抽象状态类, 封装环境对象中的特定状态所对应的行为
// class AbstractScoreState {
// public:
//     virtual ~AbstractScoreState() {}
//     virtual void CheckState() = 0;
//     virtual void AddScore(int score) {
//         score_ += score;
//         printf("score + %d, total: %d\n", score, score_);
//         CheckState();
//         printf("Now, state: %s\n", state_name_.c_str());
//     }
//     ScoreContext* GetEnv() const { return env_; }
//     int GetScore() const { return score_; }

// protected:
//     ScoreContext* env_ = nullptr;
//     std::string state_name_ = "";
//     int score_ = 0;
// };

// /// @brief 具体状态类, 实现抽象状态所对应的行为
// class HighScoreState : public AbstractScoreState {
// public:
//     HighScoreState(AbstractScoreState* state) {
//         env_ = state->GetEnv();
//         state_name_ = "优秀";
//         score_ = state->GetScore();
//     }
//     virtual void CheckState();
// };
// class MiddleScoreState : public AbstractScoreState {
// public:
//     MiddleScoreState(AbstractScoreState* state) {
//         env_ = state->GetEnv();
//         state_name_ = "中等";
//         score_ = state->GetScore();
//     }
//     virtual void CheckState();
// };
// class LowScoreState : public AbstractScoreState {
// public:
//     LowScoreState(ScoreContext* state) {    // 为了给初始状态
//         env_ = state;
//         state_name_ = "不及格";
//         score_ = 0;
//     }
//     LowScoreState(AbstractScoreState* state) {
//         env_ = state->GetEnv();
//         state_name_ = "不及格";
//         score_ = state->GetScore();
//     }
//     virtual void CheckState();
// };

// ScoreContext::ScoreContext() {
//     state_.reset(new LowScoreState(this)); // 给定初始状态
// }

// void ScoreContext::AddScore(int score) {
//     state_->AddScore(score);
// }

// void HighScoreState::CheckState() {
//     if (score_ < 60) {
//         // 更改状态至不及格
//         std::shared_ptr<AbstractScoreState> state(new LowScoreState(this));
//         env_->SetState(state);
//     }
//     else if (score_ < 90) {
//         // 更改状态至中等
//         std::shared_ptr<AbstractScoreState> state(new MiddleScoreState(this));
//         env_->SetState(state);
//     }
//     // 状态不变
// }
// void MiddleScoreState::CheckState() {
//     if (score_ < 60) {
//         // 更改状态至不及格
//         std::shared_ptr<AbstractScoreState> state(new LowScoreState(this));
//         env_->SetState(state);
//     }
//     else if (score_ >= 90) {
//         // 更改状态至优秀
//         std::shared_ptr<AbstractScoreState> state(new HighScoreState(this));
//         env_->SetState(state);
//     }
//     // 状态不变
// }
// void LowScoreState::CheckState() {
//     if (score_ >= 60) {
//         // 更改状态至中等
//         std::shared_ptr<AbstractScoreState> state(new MiddleScoreState(this));
//         env_->SetState(state);
//     }
//     else if (score_ >= 90) {
//         // 更改状态至优秀
//         std::shared_ptr<AbstractScoreState> state(new HighScoreState(this));
//         env_->SetState(state);
//     }
//     // 状态不变
// }

// void Test_17_state_impl_2() {
//     printf("-------------------- %s --------------------\n", __FUNCTION__);
//     std::shared_ptr<ScoreContext> ptr(new ScoreContext());
//     ptr->AddScore(30);
//     ptr->AddScore(40);
//     ptr->AddScore(25);
//     ptr->AddScore(-15);
//     ptr->AddScore(-25);
// }
